# !/usr/bin/env python
# -*-coding:utf-8 -*-

"""
# File       : handle_assert.py
# Time       ：2022/6/11 16:46
# Author     ：周豪权
"""
import copy
import pymysql
import json
from utils.handle_request import logger
from utils.handle_extract import ExtractUtil
from configs  import setting

#初始化一个ExtractUtil对象
eu = ExtractUtil()

class AssertUtil:
    #创建数据库连接,pymysql和mysqlclient
    def create_connection(self):
        self.conn = pymysql.connect(
            user = setting.db_user,
            password = setting.db_password,
            host = setting.db_host,
            database = setting.db_database,
            port = setting.db_port
        )
        return self.conn

    #执行sql语句
    def execute_sql(self,sql):
        #创建连接
        conn = self.create_connection()
        #创建游标
        cs = conn.cursor()
        #执行sql
        cs.execute(sql)
        #取值
        value = cs.fetchone()
        #关闭
        cs.close()
        conn.close()
        return value

    #处理所有的断言
    def assert_all(self,resp,assert_key,assert_value):
        #深拷贝一个response
        resp = copy.deepcopy(resp)
        #把json（）改成一个属性
        try:
            resp.json = resp.json()
        except Exception:
            resp.json = {"msg":"response is not json"}

        #断言结果通过jsonpath匹配出来
        if isinstance(assert_value[0],list):
            sj_data = eu.ass_ert(resp,*assert_value[0])
            yq_result = assert_value[1]


        else:
            #获取实际结果和预期结果
            sj_result,yq_result = assert_value[0],assert_value[1]
            #通过属性反射获取到属性的数据
            sj_data = getattr(resp,sj_result)

        #断言
        if assert_key == "equals":
            logger.info("断言方式：接口断言 -- 实际结果 -- %s 等于 预期结果 -- %s" % (sj_data,yq_result))
            assert sj_data==yq_result
        elif assert_key == "contains":
            logger.info("断言方式：接口断言 -- 实际结果 -- %s 包含 预期结果 -- %s" % (sj_data, yq_result))
            assert yq_result in sj_data
        elif assert_key == "db_equals":
            value = self.execute_sql(yq_result)
            if value:
                logger.info("断言方式：数据库断言 -- 实际结果 -- %s 等于 预期结果 -- %s" % (sj_data, value[0]))
                assert value[0] == sj_data
        elif assert_key == "db_contains":
            value = self.execute_sql(yq_result)
            if value:
                logger.info("断言方式：数据库断言 -- 实际结果 -- %s 包含 预期结果 -- %s" % (sj_data, value[0]))

                #如果断言结果通过jsonpath取值，则sj_data要么为具体数值，要么为list，则不需要转换成str做处理
                if isinstance(assert_value[0], list):
                    assert str(value[0]) in sj_data
                else:
                    #如果断言结果不通过jsonpath取值，将查询结果以及实际结果全部转换为字符串作数据库contain类型的断言，
                    assert str(value[0]) in json.dumps(sj_data)



if __name__ == '__main__':
    a = AssertUtil().execute_sql("select SUM(`hour`)  from  ic_report_daily_hour where left(`day_date`, 7) = '2023-07' and deleted = 0")
    print(a)